﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ComponentFactory.Krypton.Toolkit;
using FastFood.Windows.Helpers;
using FastFood.Business.Entities;
using FastFood.Business.Logic;
using System.Data.Linq;

namespace FastFood.Windows.Paneles
{
    public partial class FrmPermisos : KryptonForm
    {
        private EstadoActual estadoActual;
        private Font font;

        public FrmPermisos()
        {
            InitializeComponent();
            SetFont();

        }

        private void SetFont()
        {
            this.font = SystemFonts.IconTitleFont;
            if (this.Font != font)
            {
                this.Font = this.font;
                this.font = new Font("Tahoma", 7);
                this.dgvUsuarios.RowTemplate.Height = (TextRenderer.MeasureText("I", this.font).Height + 5) * 3;
            }
        }
        private void dgvUsuarios_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if ((e.ColumnIndex >= 0) && (e.RowIndex >= 0))
            {
                //Graphics g = e.Graphics;
                //bool selected = ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected);
                //System.Drawing.Color fcolor = (selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor);
                //System.Drawing.Color bcolor = (selected ? e.CellStyle.SelectionBackColor : e.CellStyle.BackColor);
                //Font font = e.CellStyle.Font;
                //font = new Font("Tahoma", 7);

                //Usuario usuario = this.usuarioBindingSource[e.RowIndex] as Usuario;

                //if (usuario != null)
                //{
                //    int x = e.CellBounds.Left + e.CellStyle.Padding.Left;
                //    int y = e.CellBounds.Top + e.CellStyle.Padding.Top;
                //    int width = e.CellBounds.Width - (e.CellStyle.Padding.Left + e.CellStyle.Padding.Right);
                //    int height = 13 + (e.CellStyle.Padding.Top + e.CellStyle.Padding.Bottom);

                //    g.FillRectangle(new SolidBrush(bcolor), e.CellBounds);

                //    y = y + height - 1;

                //    if (e.ColumnIndex == 0)
                //    {
                //        font = new Font("Tahoma", 9, FontStyle.Bold);

                //        if (selected)
                //            TextRenderer.DrawText(e.Graphics, " " + usuario.username, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                //        else
                //            TextRenderer.DrawText(e.Graphics, " " + usuario.username, font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                //        font = new Font("Tahoma", 8);
                //        y = y + height - 1;
                //        TextRenderer.DrawText(e.Graphics, usuario.Persona == null ? string.Empty : usuario.Persona.Informacion, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                //    }
                //}

                e.Handled = true;
            }
            else if ((e.ColumnIndex == 0) && (e.RowIndex >= 0))
            {
                e.Paint(e.ClipBounds, e.PaintParts & ~DataGridViewPaintParts.Focus);
                e.Handled = true;
            }
        }

        private void dgvUsuarios_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            if (e.RowIndex == this.usuarioBindingSource.Position)
            {
                e.DrawFocus(e.RowBounds, true);
            }
            else
            {
                using (Pen p = new Pen(System.Drawing.Color.LightGray))
                {
                    e.Graphics.DrawRectangle(p, e.RowBounds);
                }
            }
        }


        private void FrmPermisos_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                ClearControls();
                InitialLoad();
                EnabledButtons();
                EnabledControls(true);
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledButtons();
            EnabledControls(false);
            ClearControls();
            this.cmbEmpleados.Enabled = true;
            this.cmbEmpleados.Focus();
            this.usuarioBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            if (this.usuarioBindingSource.Current == null) return;
            this.estadoActual = EstadoActual.Editar;
            EnabledButtons();
            EnabledControls(false);
            this.cmbEmpleados.Enabled = false;
            this.cmbEmpleados.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (this.usuarioBindingSource.Current == null) return;

            if (MessageBox.Show("¿Desea eliminar el Registro?", Constantes.Titulo, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                DeleteUsuario();
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    EnabledButtons();
                    EnabledControls(true);
                    LoadUsuario();
                    this.dgvUsuarios.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            this.usuarioBindingSource.CancelEdit();
            if (this.estadoActual == EstadoActual.Nuevo)
            {
                ClearControls();
                if (this.dgvUsuarios.CurrentCell != null)
                    this.dgvUsuarios.CurrentCell.Selected = true;
            }
            this.estadoActual = EstadoActual.Normal;
            dgvUsuarios_CellEnter(sender, new DataGridViewCellEventArgs(0, this.usuarioBindingSource.Position));
            this.dgvUsuarios.Focus();
            EnabledControls(true);
            EnabledButtons();
        }


        private void dgvUsuarios_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                LoadUsuario();
            }
        }

        private void dgvUsuarios_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.dgvUsuarios.SelectedRows.Count != 0)
                {
                    if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        DeleteUsuario();
                    }
                }
            }
        }

        private void InitialLoad()
        {
            try
            {
                PersonalCn personalCn = new PersonalCn();
                UsuarioCn usuarioCn = new UsuarioCn();
                this.cmbEmpleados.DataSource = personalCn.listarPersonal();
                //this.cmbEmpleados.ValueMember = "ID";
                //this.cmbEmpleados.DisplayMember = "NombreCompleto";
                this.usuarioBindingSource.DataSource = usuarioCn.ListarUsuario() ;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadUsuario()
        {
            if (this.estadoActual == EstadoActual.Normal)
                LoadUsuario(this.usuarioBindingSource.Current as Usuarios);
        }

        private void LoadUsuario(Usuarios usuario)
        {
            this.cmbEmpleados.SelectedValue = usuario.usuarioID;
            this.txtUsername.Text = usuario.username;
            this.txtPassword.Text = usuario.password;
            this.chkEsPrincipal.Checked = usuario.esPrincipal;
            this.perUsuario.PersonaID = usuario.usuarioID;
        }

        private void DeleteUsuario()
        {
            this.estadoActual = EstadoActual.Eliminar;
            SaveData();
            this.estadoActual = EstadoActual.Normal;
            LoadUsuario();
            this.dgvUsuarios.Focus();
        }

        private bool SaveData()
        {
            bool result = false;
            int posicion = this.usuarioBindingSource.Position;

            try
            {
                UsuarioCn usuarioCn = new UsuarioCn();

                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        usuarioCn.AgregarUsuario(GetUsuario());
                        break;
                    case EstadoActual.Editar:
                        usuarioCn.ModificarUsuario(GetUsuario());
                        break;
                    case EstadoActual.Eliminar:
                        
                        if (DatosGenerales.PersonalActual.personalID != Convert.ToInt16(this.cmbEmpleados.SelectedValue))
                        {
                            usuarioCn.EliminarUsuario(Convert.ToInt16(this.cmbEmpleados.SelectedValue));
                            posicion -= 1;
                        }
                        else
                        {
                            Mensaje.ShowMessageAlert(this, Constantes.Titulo, "Esta tratando de Eliminar a usted mismo ¿?");
                        }
                        break;
                }

                this.usuarioBindingSource.EndEdit();
                InitialLoad();
                this.usuarioBindingSource.Position = posicion;
                result = true;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this, Constantes.Titulo, ex.Message);
            }

            return result;
        }

        private Usuarios GetUsuario()
        {
            Usuarios usuario = new Usuarios
            {
                usuarioID = Convert.ToInt16(this.cmbEmpleados.SelectedValue),
                username = this.txtUsername.Text,
                password = this.txtPassword.Text,
                esPrincipal = this.chkEsPrincipal.Checked,
                Permisos = new EntitySet<Permisos>()
            };
            usuario.Permisos.AddRange(this.perUsuario.Permisos);
            return usuario;
        }

        private bool ValidateData()
        {
            bool result = true;

            if (this.cmbEmpleados.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbEmpleados, "Seleccionar Empleado.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbEmpleados, string.Empty);
            }
            if (string.IsNullOrEmpty(this.txtUsername.Text))
            {
                this.errValidator.SetError(this.txtUsername, "Ingresar Nombre de Usuario.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtUsername, string.Empty);
            }
            if (string.IsNullOrEmpty(this.txtPassword.Text))
            {
                this.errValidator.SetError(this.txtPassword, "Ingresar Contraseña.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtPassword, string.Empty);
            }
            if (result)
            {
                if (this.perUsuario.Permisos.Count == 0)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, "Debe asignar permisos al usuario.");
                    result = false;
                }
            }

            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.gbxInformacion.Enabled = !valor;
            this.usuarioBindingNavigator.Enabled = valor;
            this.dgvUsuarios.Enabled = valor;
        }

        private void EnabledButtons()
        {
            switch (this.estadoActual)
            {
                case EstadoActual.Normal:
                    switch (this.dgvUsuarios.Rows.Count)
                    {
                        case 0:
                            this.TsbNuevo.Enabled = true;
                            this.TsbEditar.Enabled = false;
                            this.TsbEliminar.Enabled = false;
                            this.TsbGuardar.Enabled = false;
                            this.TsbCancelar.Enabled = false;
                            this.dgvUsuarios.Enabled = true;
                            this.perUsuario.EnabledPermisos = false;
                            break;
                        default:
                            //if (this.dgvUsuarios.SelectedRows.Count == 0)
                            //{
                            //    this.TsbNuevo.Enabled = true;
                            //    this.TsbEditar.Enabled = false;
                            //    this.TsbEliminar.Enabled = false;
                            //    this.TsbGuardar.Enabled = false;
                            //    this.TsbCancelar.Enabled = false;
                            //    this.dgvUsuarios.Enabled = true;
                            //    this.perUsuario.EnabledPermisos = false;
                            //}
                            //else
                            //{
                                this.TsbNuevo.Enabled = true;
                                this.TsbEditar.Enabled = true;
                                this.TsbEliminar.Enabled = true;
                                this.TsbGuardar.Enabled = false;
                                this.TsbCancelar.Enabled = false;
                                this.dgvUsuarios.Enabled = true;
                                this.perUsuario.EnabledPermisos = false;
                            //}
                            break;
                    }
                    break;
                case EstadoActual.Nuevo:
                case EstadoActual.Editar:
                    this.TsbNuevo.Enabled = false;
                    this.TsbEditar.Enabled = false;
                    this.TsbEliminar.Enabled = false;
                    this.TsbGuardar.Enabled = true;
                    this.TsbCancelar.Enabled = true;
                    this.dgvUsuarios.Enabled = false;
                    this.perUsuario.EnabledPermisos = true;
                    break;
            }
        }

        private void ClearControls()
        {
            this.perUsuario.PersonaID = 0;
            this.cmbEmpleados.SelectedIndex = -1;
            this.txtUsername.Clear();
            this.txtPassword.Clear();
            this.dtpFechaRegistro.Value = DateTime.Today;
            this.chkEsPrincipal.Checked = false;
            this.errValidator.Clear();
            this.perUsuario.ClearPermisos();
        }

    }
}
